package org.ejb.stateless;

import java.util.List;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.ejb.api.AbonnementInterface;
import org.ejb.entities.Abonnement;
import org.ejb.entities.Utilisateur;
import org.ejb.entities.ValidationException;


@SuppressWarnings(value = "unchecked")
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Stateless(mappedName = "org.ejb.stateless.AbonnementStateless@Remote", description = "Abonnement stateless", name = "AbonnementStateless")
public class AbonnementStateless implements AbonnementInterface{
	@PersistenceContext
    private EntityManager em;

    private final String cname = this.getClass().getName();
    private Logger logger = Logger.getLogger("org.ejb.stateless");
    
    public Abonnement createAbonnement(String description, Integer perCentReduction) {
        final String mname = "createAbonnement";
        logger.entering(cname, mname, "abonnement");

        // On s'assure de la validite des paramatres
        if (description == null) throw new ValidationException("Description object is null");
        Abonnement abonnement= new Abonnement(description, perCentReduction);
        em.persist(abonnement);
        
        logger.exiting(cname, mname, abonnement);
        return abonnement;
    }
    
    // commander un abonnement, un utilisateur commande un abonnement. On note abonnement_id dans un colonne d'utilisateur
    public void commandeAbonnement(Utilisateur customer, Abonnement abonnement){
    	final String mname = "commandeAbonnement";
        logger.entering(cname, mname, customer);
        
        // On s'assure de la validite des paramatres                                     
        if (customer == null) throw new ValidationException("Customer object is null");
        if (abonnement == null) throw new ValidationException("Abonnement object is null");
        
        customer.setAbonnement(abonnement);
        em.merge(customer);
        logger.exiting(cname, mname, customer);
    }
    
    public Abonnement findAbonnement(final Long id) {
        final String mname = "findAbonnement";
        logger.entering(cname, mname, id);

        // On s'assure de la validite des paramatres
        if (id == null)
            throw new ValidationException("Invalid id");

        Abonnement abonnement;

        // On recherche l'objet a partir de son identifiant
        abonnement = em.find(Abonnement.class, id);

        logger.exiting(cname, mname, abonnement);
        return abonnement;
    }

    public void deleteAbonnement(final Abonnement abonnement) {
        final String mname = "deleteAbonnement";
        logger.entering(cname, mname, abonnement);

        // On s'assure de la validite des paramatres
        if (abonnement == null)
            throw new ValidationException("Abonnement object is null");

        // On supprime l'objet de la base de donnees
        em.remove(em.merge(abonnement));

        logger.exiting(cname, mname);
    }

    public Abonnement updateAbonnement(final Abonnement abonnement, final int perCentReduction, final long aid) {
        final String mname = "updateAbonnement";
        logger.entering(cname, mname, abonnement);

        // On s'assure de la validite des paramatres
        if (abonnement == null)
            throw new ValidationException("Abonnement object is null");

        abonnement.setPerCentReduction(perCentReduction);
        abonnement.setId(aid);

        // On modifie l'objet de la base de donnees
        em.merge(abonnement);

        logger.exiting(cname, mname, abonnement);
        return abonnement;
    }

    public List<Abonnement> findAbonnements() {
        final String mname = "findAbonnements";
        logger.entering(cname, mname);

        Query query;
        List<Abonnement> abonnement;

        // On modifie l'objet de la base de donnees
        query = em.createQuery("SELECT c FROM Abonnement c");
        abonnement = query.getResultList();

        logger.exiting(cname, mname, abonnement.size());
        return abonnement;
    }
}
